package com.teach.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.UUID;

public class ALiBaBaOSS {
    private static String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
    private static String accessKeyId = "LTAI5tKdHhtQ8spDceYvGLwu";
    private static String accessKeySecret = "z56sixNWmIZoLKgk4o6y2c0IkuyObc";
    // 填写Bucket名称，例如examplebucket。
    private static String bucketName = "huangyujie";
    // 填写Object完整路径，完整路径中不能包含Bucket名称，例如exampledir/exampleobject.txt。
    private static String objectName = "hyj01/hyj.jpg";
    // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。
    // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。
    private static String filePath= "E:\\娱乐\\桌面壁纸\\1.jpg";


    public static String uploadFileByStreamPublic(MultipartFile file) throws IOException {


        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
        InputStream inputStream = file.getInputStream();
        String urlStr = "";
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        try {
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentEncoding("utf-8");
            if (fileName.toLowerCase().endsWith("mp3")) {
                metadata.setContentType("audio/mp3");
            } else if (fileName.toLowerCase().endsWith("mp4")) {
                metadata.setContentType("video/mp4");
            } else if (fileName.toLowerCase().endsWith("wav")) {
                metadata.setContentType("audio/wav");
            } else if (fileName.toLowerCase().endsWith("jpg")) {
                metadata.setContentType("image/jpg");
            } else if (fileName.toLowerCase().endsWith("jpeg")) {
                metadata.setContentType("image/jpeg");
            } else if (fileName.toLowerCase().endsWith("bmp")) {
                metadata.setContentType("image/bmp");
            } else if (fileName.toLowerCase().endsWith("gif")) {
                metadata.setContentType("image/gif");
            } else {// png
                metadata.setContentType("image/png");
            }
            // 创建PutObject请求。
            ossClient.putObject(bucketName, fileName, inputStream,metadata);
            // 设置签名URL过期时间，单位为毫秒。
            Date expiration = new Date(new Date().getTime() + 3600 * 1000);
            /*urlStr = " https://dabinggao.oss-cn-hangzhou.aliyuncs.com/"+newFileName;*/
            urlStr = "https://huangyujie.oss-cn-hangzhou.aliyuncs.com/"+fileName;
            // 文件上传时设置访问权限ACL。
            // meta.setObjectAcl(CannedAccessControlList.Private);

            // 通过UploadFileRequest设置多个参数。
            // 依次填写Bucket名称（例如examplebucket）以及Object完整路径（例如exampledir/exampleobject.txt），Object完整路径中不能包含Bucket名称。
            UploadFileRequest uploadFileRequest = new UploadFileRequest("examplebucket", "exampledir/exampleobject.txt");

            // 通过UploadFileRequest设置单个参数。
            // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
            uploadFileRequest.setUploadFile("D:\\localpath\\examplefile.txt");
            // 指定上传并发线程数，默认值为1。
            uploadFileRequest.setTaskNum(5);
            // 指定上传的分片大小，单位为字节，取值范围为100 KB~5 GB。默认值为100 KB。
            uploadFileRequest.setPartSize(1 * 1024 * 1024);
            // 开启断点续传，默认关闭。
            uploadFileRequest.setEnableCheckpoint(true);
            // 记录本地分片上传结果的文件。上传过程中的进度信息会保存在该文件中，如果某一分片上传失败，再次上传时会根据文件中记录的点继续上传。上传完成后，该文件会被删除。
            // 如果未设置该值，默认与待上传的本地文件同路径，名称为${uploadFile}.ucp。
            uploadFileRequest.setCheckpointFile("yourCheckpointFile");
            // 文件的元数据。
            uploadFileRequest.setObjectMetadata(metadata);
            // 设置上传回调，参数为Callback类型。
            //uploadFileRequest.setCallback("yourCallbackEvent");

            // 断点续传上传。
            ossClient.uploadFile(uploadFileRequest);

        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (Throwable ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            // 关闭OSSClient。
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        System.err.println(urlStr);
        return urlStr;
    }


}